/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright (c) 2008-2009, The KiWi Project (http://www.kiwi-project.eu)
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * - Redistributions of source code must retain the above copyright notice, 
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice, 
 *   this list of conditions and the following disclaimer in the documentation 
 *   and/or other materials provided with the distribution.
 * - Neither the name of the KiWi Project nor the names of its contributors 
 *   may be used to endorse or promote products derived from this software 
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 * Contributor(s):
 * 
 * 
 */
package kiwi.core.model.rdf;

import org.hibernate.Hibernate;
import org.hibernate.annotations.BatchSize;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Index;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import java.io.Serializable;

/**
 * The KiWiAnonResaource represents the anonymous RDF resource.
 * 
 * @author Sebastian Schaffert
 */
@Entity
@DiscriminatorValue("ANON")
//@SecondaryTable( name = "KIWIRESOURCE")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@BatchSize(size = 100)
//@org.hibernate.annotations.Table(appliesTo="KIWIRESOURCE", optional=false)
public class KiWiAnonResource extends KiWiResource implements Serializable {
    
	private static final long serialVersionUID = -873594698794527452L;

	@Basic
    @Index(name="anonid_index")
    @Column(length = 255)
//    @Column(table = "KIWIRESOURCE", length = 255)
    private String anonId;

    public KiWiAnonResource() {
        super();
    }
    
    public KiWiAnonResource(String id) {
        super();
        this.anonId = id;
    }

    public String getAnonId() {
        return anonId;
    }

    public void setAnonId(String id) {
        this.anonId = id;
    }


    @Override
    public String toString() {
        return "_:"+anonId;
    }

    @Override
	public String getKiwiIdentifier() {
		return "bnode::"+getAnonId();
	}

	/**
	 * @author
	 * @return
	 * @see KiWiNode#getCacheKey()
	 */
	@Override
	public String getCacheKey() {
		return anonId;
	}
    
	public String getNamespacePrefix() {
		return "blank";
	}

	@Override
	public boolean isAnonymousResource() {
		return true;
	}

	@Override
	public boolean isLiteral() {
		return false;
	}

	@Override
	public boolean isUriResource() {
		return false;
	}

	@Override
	public String getShortName() {
		return toString();
	}


    /**
     * Return a representation of the node in TURTLE syntax.
     * <p/>
     * http://www.w3.org/TeamSubmission/turtle/
     *
     * @return
     */
    @Override
    public String toTurtle() {
        return "_:"+anonId;
    }

    /**
     * Return a representation of the node in RDF/JSON syntax.
     * <p/>
     * http://n2.talis.com/wiki/RDF_JSON_Specification
     *
     * @return
     */
    @Override
    public String toJSON(boolean asObject) {
        String result = "\"_:"+anonId+"\"";


        if(asObject) {
            return "{  \"type\" : \"bnode\", \"value\" : "+result+" }";
        } else {
            return result;
        }

    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (Hibernate.getClass(this) != Hibernate.getClass(o)) {
            return false;
        }


        KiWiAnonResource that = (KiWiAnonResource) o;

        if (getAnonId() != null ? !getAnonId().equals(that.getAnonId()) : that.getAnonId() != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        return getAnonId() != null ? getAnonId().hashCode() : 0;
    }
}
